//
//  TSCMyNaviBarCreator.m
//  Tsc_IOS
//
//  Created by Rio on 15-9-5.
//  Copyright (c) 2015年 idream. All rights reserved.
//
// 来由：
// 1. 为了创建整个项目统一的NavigationBar，一开始，将此方法以“静态方法”的形式，写在MyUIUtil中。但这样无法给按钮注册事件，因为要addTarget，但在静态方法中，无法引用实例变量
// 2. 然后，我单独写了TSCMyClickBtn，并通过block进行点击事件注册，这样就可以继续在MyUIUtil中封装统一的静态方法，而无需addTarget。但TSCMyClickBtn中通过touchesEnded()->locationInView()判断，事件结束时的点击位置。这种判断方法，对于直接添加掉viewController.view中的TSCMyClickBtn没有问题，可以准确判断；但对于添加到leftBarButtonItems中的按钮来说，总是无法准确判断。分析原因，可能是因为leftBarButtonItems重新对其元素进行了布局，导致该方法失效。
// 3. 为此，创建该类，不再通过MyUIUtil中静态方法的方式添加统一的NavigationBar


#import "TSCMyNaviBarCreator.h"
#import "TSCMyUtil.h"
#import "TSCMyUIUtil.h"

@implementation TSCMyNaviBarCreator

// 再提供一个方法，只需要一行代码就可以创建naviBar
- (TSCMyNaviBarCreator *) initAndCreateWithViewController:(UIViewController *)vc hasGoBackButton:(BOOL)hasGoBackButton goBackVC:(UIViewController *) goBackVC hasAppLogo:(BOOL)hasAppLogo titleResourceKey:(NSString *)titleResourceKey iconResourceNameArray:(NSArray *)iconResourceNameArray iconClickedListenerArray:(NSArray *)iconClickedListenerArray {
    self = [self initWithViewController:vc hasGoBackButton:hasGoBackButton goBackVC:(UIViewController *) goBackVC hasAppLogo:hasAppLogo titleResourceKey:titleResourceKey iconResourceNameArray:iconResourceNameArray iconClickedListenerArray:iconClickedListenerArray];
    
    [self createNaviBar];
    
    return self;
}

// 提供一个方法，只需要两行代码就可以创建naviBar
- (TSCMyNaviBarCreator *) initWithViewController:(UIViewController *)vc hasGoBackButton:(BOOL)hasGoBackButton goBackVC:(UIViewController *) goBackVC hasAppLogo:(BOOL)hasAppLogo titleResourceKey:(NSString *)titleResourceKey iconResourceNameArray:(NSArray *)iconResourceNameArray iconClickedListenerArray:(NSArray *)iconClickedListenerArray {
    
    // 方法一：只需要一行代码就可以创建naviBar
    
    self = [self init];
    
    _viewController = vc;
    _hasGoBackButton = hasGoBackButton;
    _goBackVC = goBackVC;
    _hasAppLogo = hasAppLogo;
    _titleResourceKey = titleResourceKey;
    _iconResourceNameArray = iconResourceNameArray;
    _iconClickedListenerArray = iconClickedListenerArray;
    
    return self;
    
    //    // 方法二：通过init()和属性赋值创建：
    //    _nbc = [[TSCMyNaviBarCreator alloc]init];
    //    _nbc.viewController = self;
    //    _nbc.hasGoBackButton = YES;
    //    _nbc.hasAppLogo = YES;
    //    _nbc.titleResourceKey = @"title_create_shop";
    //    _nbc.iconResourceNameArray = [NSArray arrayWithObjects:@"ic_help_96x96.png", @"ic_cart_96x96.png", nil];
    //    _nbc.iconClickedListenerArray = [NSArray arrayWithObjects:^(UIButton * btn) {
    //        NSLog(@"help:%@", btn);
    //    }, ^(UIButton *btn){
    //        NSLog(@"cart:%@", btn);
    //    }, nil];
}

/**
 * 创建整个项目统一风格的navigationBar
 *
 * @date 2015-09-05
 * @author Rio
 *
 *
 *
 */
- (void) createNaviBar {
    
    // 方法二：仅指定各个UI元素的宽高，而其位置由naviBar自行决定
    
    // 参数检查
    NSAssert(_viewController != nil, @"[E]%s: 创建naviBar时，还未初始化_viewController！", __FUNCTION__);
    
    // 显示nvb
    _viewController.navigationController.navigationBarHidden = NO;
    
    // 获得nvb尺寸
    CGSize nvbSize = _viewController.navigationController.navigationBar.frame.size;
    
    // 定义各配置变量
    CGFloat padding = nvbSize.height / 8; // UI元素与元素的间距、UI元素与nvb上下边沿的间距
    CGFloat iconWH = nvbSize.height - padding * 2; // icon的宽高
    
    
    // ===== 1 左侧UI元素
    
    // navigationBar左右两侧的UI元素数组
    NSMutableArray * barItemArrayLeft = [[NSMutableArray alloc]init];
    NSMutableArray * barItemArrayRight = [[NSMutableArray alloc]init];
    
    
    // 返回按钮
    if (_hasGoBackButton) {
        UIButton * btnGoBack = [UIButton buttonWithType:UIButtonTypeSystem];
        [btnGoBack setBackgroundImage:[UIImage imageNamed:@"ic_btn_navi_go_back_96x96.png"] forState:UIControlStateNormal];
        btnGoBack.frame = CGRectMake(0, 0, iconWH, iconWH); // 仅指定宽高，位置由navigationBar自行控制，以便实现SizeClasses
        [btnGoBack addTarget:self action:@selector(actionBtnGoBackClicked) forControlEvents:UIControlEventTouchUpInside];
        
        [barItemArrayLeft addObject:[[UIBarButtonItem alloc]initWithCustomView:btnGoBack]];
    }
    
    
    // app_logo图标
    if (_hasAppLogo) {
        UIImageView * ivAppLogo = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"ic_app_logo_96x96.png"]];
        ivAppLogo.frame = CGRectMake(0, 0, iconWH, iconWH); // 仅指定宽高，位置由navigationBar自行控制，以便实现SizeClasses
        
        [barItemArrayLeft addObject:[[UIBarButtonItem alloc]initWithCustomView:ivAppLogo]];
    }
    
    // 界面标题
    if ([TSCMyUtil isStringEmpty:_titleResourceKey] == false) {
        UILabel * lbTitle = [[UILabel alloc]init];
        lbTitle.font = [TSCMyUIUtil getSystemDefaultFont]; // 使用系统默认字体
        lbTitle.text = NSLocalizedString(_titleResourceKey, nil);
        CGSize lb2RealSize = [lbTitle.text boundingRectWithSize:CGSizeMake(0, nvbSize.height - padding * 2) options:NSStringDrawingTruncatesLastVisibleLine | NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading attributes: @{NSFontAttributeName: lbTitle.font} context:nil].size; // 在限定高度、字数的情况下，计算label的实际宽度
        lbTitle.frame = CGRectMake(0, 0, lb2RealSize.width, nvbSize.height); // 仅指定宽高，位置由navigationBar自行控制，以便实现SizeClasses
        
        [barItemArrayLeft addObject:[[UIBarButtonItem alloc]initWithCustomView:lbTitle]];
    }
    
    // ===== 2 右侧UI元素
    
    // 计算右侧一共有多少个UI元素
    NSInteger rightUINum = 0;
    for (NSString * iconResourceName in _iconResourceNameArray) {
        if([TSCMyUtil isStringEmpty:iconResourceName] == false) {
            rightUINum++;
        } else {
            NSLog(@"[W]%s:自定义导航栏右侧图标名称为空！可能导致图标点击事件不匹配！", __FUNCTION__);
        }
    }
    
    // 注：因为[barItemArrayRight addObject]的特点是先添加的在右边，跟视觉效果不符，所以i从max开始倒数，而不是从0开始正数
    //    for (NSInteger i = 0, max = [_iconResourceNameArray count]; i < max; i++) {
    for (NSInteger i = [_iconResourceNameArray count] - 1; i >= 0; i--) {
        NSString * iconResourceName = _iconResourceNameArray[i];
        
        if ([TSCMyUtil isStringEmpty:iconResourceName] == false) {
            UIButton * btn = [UIButton buttonWithType:UIButtonTypeSystem];
            [btn setImage:[UIImage imageNamed:iconResourceName] forState:UIControlStateNormal];
            btn.frame = CGRectMake(0, 0, iconWH, iconWH);
            
            // 注册icon点击事件
            BIconClickedListener listener = [_iconClickedListenerArray objectAtIndex:i];
            if (listener) {
                btn.tag = i; // 将该icon的下标，当做tag保存在按钮上
                [btn addTarget:self action:@selector(actionIconClicked:) forControlEvents:UIControlEventTouchUpInside];
            }
            
            [barItemArrayRight addObject:[[UIBarButtonItem alloc]initWithCustomView:btn]];
        }
    }
    
    // 添加自定义导航栏
    _viewController.navigationItem.leftBarButtonItems = barItemArrayLeft;
    _viewController.navigationItem.rightBarButtonItems = barItemArrayRight;
    
    
    // 方法一：手工计算并绘制各个UI元素的大小、位置
    //    // ===== 1 左侧UI元素
    //
    //    CGFloat leftUIX = 0 + padding; // 从左到右绘制UI元素，下一个UI元素的x值
    //
    //    // 创建一个自定义view（将作为LeftBarItem显示）
    //    UIView * viLeftBarItem = [[UIView alloc]init];
    //    viLeftBarItem.frame = CGRectMake(0, 0, nvbSize.width , nvbSize.height); // 宽=nvb，高=nvb
    //
    //    // 返回按钮
    //    if (hasGoBackBtn) {
    //        // 更新uix
    //        leftUIX -= padding; // 注：由于返回按钮比较窄，所以不要padding
    //
    //        TSCMyClickBtn * btnGoBack = [TSCMyClickBtn buttonWithType:UIButtonTypeSystem];
    //        [btnGoBack setBackgroundImage:[UIImage imageNamed:@"ic_btn_navi_go_back_96x96.png"] forState:UIControlStateNormal];
    //        btnGoBack.frame = CGRectMake(0, 0, iconWH, iconWH);
    //        btnGoBack.center = CGPointMake(leftUIX + iconWH / 2, nvbSize.height / 2); // 左靠nvb+垂直居中
    //        // 方法一：使用原生态addTarget。缺点：需要全局变量保存vc，且需要在该文件中添加“私有”方法支持返回事件
    //        //    [btnGoBack addTarget:self action:@selector(goBack) forControlEvents:UIControlEventTouchUpInside]; // 注册事件——返回
    //        // 方法二：使用自定义Button，并用block方式实现事件注册。SB的IOS！其实这一点安卓做的挺好
    //        btnGoBack.btnClickedListener = ^(TSCMyClickBtn *button) {
    //            [viewController.navigationController popViewControllerAnimated:YES];
    //        };
    //        [viLeftBarItem addSubview:btnGoBack];
    //
    //        // 更新uix
    //        //        leftUIX += btnGoBack.frame.size.width + padding; // 注：由于返回按钮比较窄，所以不要padding
    //        leftUIX += btnGoBack.frame.size.width; // 注：由于返回按钮比较窄，所以不要padding
    //    }
    //
    //    // app_logo图标
    //    if (hasAppLogo) {
    //        UIImageView * ivAppLogo = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"ic_app_logo_96x96.png"]];
    //        ivAppLogo.frame = CGRectMake(0, 0, iconWH, iconWH);
    //        ivAppLogo.center = CGPointMake(leftUIX + ivAppLogo.frame.size.width / 2, nvbSize.height / 2); // 左靠btn+垂直居中
    //        [viLeftBarItem addSubview:ivAppLogo];
    //
    //        // 更新uix
    //        leftUIX += ivAppLogo.frame.size.width + padding;
    //    }
    //
    //    // 界面标题
    //    if ([TSCMyUtil isStringEmpty:titleResourceKey] == false) {
    //        UILabel * lbTitle = [[UILabel alloc]init];
    //        lbTitle.font = [TSCMyUIUtil getSystemDefaultFont]; // 使用系统默认字体
    //        lbTitle.text = NSLocalizedString(titleResourceKey, nil);
    //        CGSize lb2RealSize = [lbTitle.text boundingRectWithSize:CGSizeMake(0, nvbSize.height - padding) options:NSStringDrawingTruncatesLastVisibleLine | NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading attributes: @{NSFontAttributeName: lbTitle.font} context:nil].size; // 在限定高度、字数的情况下，计算label的实际宽度
    //        lbTitle.frame = CGRectMake(0, 0, lb2RealSize.width, nvbSize.height - padding);
    //        lbTitle.center = CGPointMake(leftUIX + lbTitle.frame.size.width / 2, nvbSize.height / 2); // 左靠iv+padding+垂直居中
    //        [viLeftBarItem addSubview:lbTitle];
    //    }
    //
    //    // ===== 2 右侧UI元素
    //
    //    // 计算右侧一共有多少个UI元素
    //    NSInteger rightUINum = 0;
    //    for (NSString * iconResourceName in iconResourceNameArray) {
    //        if([TSCMyUtil isStringEmpty:iconResourceName] == false) {
    //            rightUINum++;
    //        } else {
    //            NSLog(@"[W]%s:自定义导航栏右侧图标名称为空！可能导致图标点击事件不匹配！", __FUNCTION__);
    //        }
    //    }
    //
    //    NSInteger rightUIX = nvbSize.width - rightUINum * iconWH; // 右侧UI元素中最靠左的元素的X值
    //
    //    for (NSInteger i = 0, max = [iconResourceNameArray count]; i < max; i++) {
    //        NSString * iconResourceName = iconResourceNameArray[i];
    //
    //        if ([TSCMyUtil isStringEmpty:iconResourceName] == false) {
    //            TSCMyClickBtn * btn = [TSCMyClickBtn buttonWithType:UIButtonTypeSystem];
    //            [btn setImage:[UIImage imageNamed:iconResourceName] forState:UIControlStateNormal];
    //            btn.frame = CGRectMake(0, 0, iconWH, iconWH);
    //            btn.center = CGPointMake(rightUIX + iconWH / 2 , nvbSize.height / 2); // 计算的x+垂直居中
    //
    //            [viLeftBarItem addSubview:btn];
    //
    //            // TODO 注册icon点击事件
    //            BBtnClickedListener block = [iconBlockArray objectAtIndex:i];
    //            if (block) {
    //                btn.btnClickedListener = block;
    //            }
    //
    //            // 更新rightUIX
    //            rightUIX += iconWH;
    //        }
    //    }
    //
    //    // 在导航栏最左侧创建一个占位符，使所有子view整体向左移动16，且不会影响任何子view响应touchesEnded()方法
    //    UIBarButtonItem *occup = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:nil action:nil];
    //    occup.width = -adjustX;
    //
    //    // 添加自定义导航栏
    //    // 方法一：使用rightBarButtonItem。不行！因为rightBarButtonItem会覆盖leftBarButtonItem，导致leftBarButtonItem上的UI元素事件失效
    //    // 方法二：自定义view下包含左右两个子view（当做自定义的leftBarButtonItem和rightBarButtonItem），再把自定义view当做navigationItem.leftBarButtonItem。不行！因为多层自定义子view将导致位置混乱。SB的IOS接口！
    //    // 方法三：无论是左侧的UI元素，还是右侧的UI元素，一律添加到自定义view中。可行！只不过左侧UI元素从x=0开始，右侧UI元素从右侧贴紧屏幕来计算x值。然后将自定义view整体作为leftBarButtonItem加入。这样不会影响事件注册
    //    viewController.navigationItem.leftBarButtonItems = [NSArray arrayWithObjects:occup, [[UIBarButtonItem alloc] initWithCustomView:viLeftBarItem], nil];
}

#pragma mark 事件响应

// 点击了返回按钮
- (void) actionBtnGoBackClicked {
    if (_goBackVC) {
        [_viewController.navigationController popToViewController:_goBackVC animated:YES];
    } else {
        [_viewController.navigationController popViewControllerAnimated:YES];
    }
}

// 当右侧icon被点击时
- (void) actionIconClicked:(UIButton *) btn {
    // 获得icon的下标
    NSInteger index = btn.tag;
    
    // 找到对应的listener
    BIconClickedListener listener = _iconClickedListenerArray[index];
    
    // 执行回调
    listener(btn);
}

@end
